Houdini数学 : 回転行列の可視化
はじめに
回転行列を使った、座標回転を可視化してみました。
回転行列を利用した座標変換
回転行列を使うことで、座標 $ (x_1, \ y_1) を原点の周りに $ \theta 回転させるような座標変換を行うことができます。
$ \binom{x_2}{y_2} = \begin{pmatrix} cos \theta & -sin \theta \\ sin \theta & cos \theta \end{pmatrix} \binom{x_1}{y_1}
回転後の座標は $ (x_2, \ y_2) になります。
回転行列を使わない形に書き換えると、以下のようになります。
$ \begin{cases} x_2 = (cos \theta) \cdot x_1 - (sin \theta) \cdot y_1 \\ y_2 = (sin \theta) \cdot x_1 + (cos \theta) \cdot y_1 \end{cases}
Houdiniを使った回転の可視化
今回は直線を回転させてみます。
https://gyazo.com/8d6a5c3bd0c3c5926833d11d6d0871ce
■STEP1 : ラインを作る
Lineノードを利用して、原点からX軸プラス方向に伸びるラインを作成します。
table:パラメータ
Origin {0, 0, 0}
Direction {1, 0, 0}
https://gyazo.com/1b3d83ee84098cc8906ee2bbb8aef00e
https://gyazo.com/bb14c972c361cdd1fbed9a2fb0d33136
■STEP2 : 回転の実装
ここで、回転を行う数式は以下のようになっていました。
$ \begin{cases} x_2 = (cos \theta) \cdot x_1 - (sin \theta) \cdot y_1 \\ y_2 = (sin \theta) \cdot x_1 + (cos \theta) \cdot y_1 \end{cases}
これをAttributeWrangleノード上で実装すると以下のようになります。
code:AttributeWrangle(c)
// 回転量θを取得(単位 : ラジアン)
float theta = chf("theta");
// 回転前の座標(x1, y1)
float x1 = @P.x;
float y1 = @P.y;
// 回転を行う
float x2 = cos(theta) * x1 - sin(theta) * y1;
float y2 = sin(theta) * x1 + cos(theta) * y1;
// 回転後の座標(x2, y2)をポイントに反映
@P = set(x2, y2);
https://gyazo.com/57fd9b15509c101fe7712f165d342a1f
■結果
回転量を増やすと、ラインが反時計回りに回転します。
https://gyazo.com/8d6a5c3bd0c3c5926833d11d6d0871ce
実際には、ラインの各ポイントが原点の周りに回転量 $ \theta だけ回転しています。
おまけ
Lineの位置や向きを変えたり、ライン以外の物を回転させてみると、回転行列への理解が深まって面白いかもしれません。
https://gyazo.com/2787bc2a555066dbe61d1cec0ce9dd99
https://gyazo.com/01798775594cacda191c417567a461dd
https://gyazo.com/755439041963ad0dd942f3551fbc5add
参考リンク
回転行列(Wikipedia)